EC2でDjangoアプリへアクセスできない場合に確認することをまとめてみた

EC2でDjangoアプリへアクセスできない場合に確認することをまとめてみた

EC2にDjangoアプリを起動したものの、外部からアクセスができなかったため原因を調査し、注意点をまとめてみました
Clock Icon2024.09.24

はじめに

こんにちは、アノテーションのなかたです。
今回は、EC2にDjangoアプリを起動したものの、外部からアクセスができないということがありました。
調査にあたって、何が原因であるか確認を行ったのでそれらをまとめてみました。
Djangoの構築手順は、以下のブログにて記述しています。
https://dev.classmethod.jp/articles/amazon-linux-2023-django-4-2/

確認した事項

1. セキュリティグループは適切に開いているか

Djangoアプリではデフォルトで8000番ポートを使用します。
そのため、インバウンドルールにてTCPの8000番が開けられているか確認します。

2. インターネットからの通信を受け付けられる状態か

インターネットからのトラフィックがEC2インスタンスに流れる状態でなければなりません。
一般的な構成であれば、以下のどちらかになるのではないでしょうか。

  • パブリックサブネットに配置:パブリックIPアドレスが付与されている
  • プライベートサブネットに配置:NATゲートウェイがパブリックサブネットで設置されている

3. DEBUG変数がFalseに設定されているか

DEBUG変数とは、Djangoのデバッグ環境のフラグを示します。
settings.pyに格納されている変数になります。
Trueの場合、以下の画像のようにエラーページにトレースバックや設定情報が表示されます。
スクリーンショット 2024-09-24 14.11.09
そのため、本番環境ではFalseに設定することが必要です。

4. ALLOWED_HOST変数が適切に設定されているか

こちらもsettings.pyに格納されている変数になります。
Djangoアプリケーションを公開する際は、セキュリティ対策としてALLOWED_HOST変数にホスト/ドメイン名を追加することが求められるようです。

`ALLOWED_HOST`変数とは

Django サイトを配信できるホスト/ドメイン名を表す文字列のリストです。これはセキュリティ対策の手段の1つで、一見安全な設定の Web サーバでも晒される可能性が高い、 HTTP Host header 攻撃 を防ぐことができます。
https://docs.djangoproject.com/ja/5.1/ref/settings/#allowed-hosts

ALLOWED_HOST変数が適切に設定されていない場合、runserverを実行した際にエラーが表示されます。

bash
$ python3.11 manage.py runserver 0.0.0.0:8000
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.

EC2インスタンスでは、パブリックIPアドレスもしくはパブリックDNSアドレスを追加することでアプリケーションを公開が可能です。

ALLOWED_HOSTS 変数が空の場合

DEBUG が True であり、かつ ALLOWED_HOSTS が空の場合、ホストは ['.localhost', '127.0.0.1', '[::1]'] に対して検証されます。
https://docs.djangoproject.com/ja/5.1/ref/settings/#debug

5. 適切にルーティングが行えるか

EC2環境で作業する場合、Djangoのチュートリアルでよく見るロケットは飛びません。
URLパスが存在しない場合、以下のようなページ表示になります。
スクリーンショット 2024-09-24 14.18.04
したがって、自前で簡単な処理を記述する必要があります。
また、作成したアプリにinclude関数でルーティングを通していないなどのミスにも注意が必要です。

HttpResponseでビューを簡単にテスト

ビューを返す方法として、チュートリアルで紹介されているHttpResponseを用いる方法がシンプルでおすすめです。

polls/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

https://docs.djangoproject.com/ja/4.2/intro/tutorial01/#write-your-first-view

まとめ

以上、EC2インスタンスでDjangoアプリケーションへアクセスできない際の注意点を紹介しました。
基本的に、ネットワーク構成かsettings.pyが原因になると思います。
複数の条件が重なってアクセスを阻んでいることもありがちなので、1つずつ検証するのが着実で良いと感じました。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.